/**
 * @copyright Copyright (c) 2023..
 *
 * @file    adr_trigger.h
 * @brief   描述 adr_trigger判断类
 * @author  HC(202206728@any3.com)
 * @version 1.0
 * @date    2023-09-27
 */
#ifndef ADR_COMPONENT_H
#define ADR_COMPONENT_H

#include <queue>
#include "data_structure.h"
#include "json/json.h"
#include "parse_proto.h"

namespace DcAdr
{
    class AdrTrigger
    {
    public:
        static AdrTrigger &getInstance();

        //是否包含这个topic
        bool protoRuleContainTopic(const std::string &topic);
        uint8_t getEventLevl(const std::string &eventId);

        //执行条件引擎
        void execTriggerEvent(const ProtoData &data);

        void settrigLaterTime(const std::string &eventId);

        //检查是否有事件触发
        bool checkTriggerEvent(const ProtoData &data, std::shared_ptr<ProtoCondRule_t> protoRule, std::shared_ptr<ProtoCondInfo_t> protoInfo);
        //检查事件单个信号值判断
        bool checkTriggerEventSignal(const ProtoData &data, ProtoCondRuleSignalInfo_t &signal);
        //检查事件详细信息多个信号
        bool checkTriggerEventDetail(std::shared_ptr<ProtoCondRule_t> rule, const std::string &id, bool checkCurrentRule);
        //处理单信号逻辑
        template <typename retT>
        bool signalProcess(const std::string &topic, ProtoCondRuleSignalInfo_t &signal, google::protobuf::Message *parser);
        //获取信号之
        template <typename retT>
        retT getProtoMessageMemberValue(google::protobuf::Message &message, const std::queue<std::string> &protoStruct);
        //获取相关message的成员的value
        Json::Value ProtoMemberToJsonValue(const google::protobuf::Message &message, std::queue<std::string> &protoStruct);
        //比较信号值
        template <typename calssType>
        bool compareSignalValue(const calssType &signalValue, const ProtoCondRuleSignalInfo_t &signal);
        //gd 获取单个事件的配置信息
        bool getOneEventProtoCondInfo(const string &eventId,std::shared_ptr<ProtoCondInfo_t> &protoCondInfo);



    private:
        AdrTrigger();
        ~AdrTrigger();
        //初始化proto解析器
        ParseProto m_protoParse;
        Json::Value m_tmpSignalValue;

        // 条件存在持续时间字段时进行判断
        bool judgeDurationTime(const ProtoData &data, ProtoCondRuleSignalInfo_t &signal, bool ret);

        // std::map<std::string, Json::Value> m_lastValueData;    //缓存trigger信号的map<signame, value>;有跳变判断的就可以与之前这里的值比较。
    };
}

#endif // ADR_COMPONENT_H